""" 什么是元组"""

"""
    除了列表,元组也是Python语言提供的内置数据结构之一。
一、元组与列表的主要区别
    1.元组用小括号表示(列表用中括号表示)
"""


def yuanzu():
    t = ('Python', 18, True)
    print(t)
    """
    小括号可以省略
    """
    t = 'Python', 18, True
    print(t)

    """
    空元组的两种表示方法
    """
    print(())  # ()
    print(tuple())  # ()
    """
    2.元组是不可变类型(列表是可变类型)
    为什么要设计元组这样的不可变类型呢?因为一旦创建了不可变类型的对象,对象内部的所有数据
就不能被修改了,这样就避免了由于修改数据导致的错误。此外,对于不可变类型的对象,在多任务环境下
同时操作对象时不需要加锁。因此,在程序中尽量使用不可变类型的对象。
    """
    t = ('Python', 18, True)
    # t[1] = 20 # TypeError: 'tuple' object does not support item assignment

    """
    对于元组中可变类型的数据,元组中存储的是其引用(在内存中的地址),因此,
存储的引用是不能被改变的,也就说,不能再引用任何其它对象。但是,引用所指向的可变类型的数据
是可以被改变的。
    """

    t = (1, [5, 7], 8)
    # t[1] = 7
    t[1][0] = 7
    print(t)  # (1, [7, 7], 8)


# yuanzu()

"""只包含一个元素的元组"""


def baohanyige():
    t = (18)
    print(t)  # 18
    print(type(t))  # <class 'int'>

    """
    元组中至少要包含一个逗号,即使元组只有一个元素,否则I,小括号会被看做是数学公式中的小括号。
    """
    t = (18,)
    print(t)  # (18,)
    print(type(t))  # <class 'tuple'>


# baohanyige()


"""多个变量同时赋值"""


def duogefuzhi():
    # a, b = [5, 8]
    [a, b] = [5, 8]
    print(a, b) # 5 8

    # a, b = 5, 8
    a, b = [5, 8]
    print(a, b) #5 8

    """
    赋值运算符左右两边的元素个数必须是相同的,否则会抛出ValueError
    """
    # a, b = 5, 8, 3 #ValueError: too many values to unpack (expected 2)
    a, *b, c = 1, 2, 3, 4
    print(a, b, c ) # 1 [2, 3] 4
    a, b, *c = 1,2,3,4
    print(a, b ,c) #1 2 [3, 4]
    print()
    """
    变量值交换
    """
    a = 5
    b = 8
    # 赋值运算符的左右两边都是元组,左边是变量的元组,右边是表达式的元组
    # 先将右边的所有表达式都计算完之后,再分别赋值给左边的,所有变量
    a,b = b, a
    print(a, b) #8 5
duogefuzhi()

if __name__ == "__main__":
    print()
